home *** CD-ROM | disk | FTP | other *** search
- *
- * c68 support routines .Xldiv, .Xlrem, .Xulrem, .Xuldiv, .Xasldiv,
- * .Xaslrem, .Xasulrem, .Xasuldiv
- *
- * quotient and remainder of signed and unsigned long quantities
- * (based on a routine used by SozobonX's xdlibs library)
- *
- .text
-
- .globl .Xldiv
- .globl .Xlrem
- .globl .Xulrem
- .globl .Xuldiv
-
- .globl .Xasldiv
- .globl .Xaslrem
- .globl .Xasulrem
- .globl .Xasuldiv
-
-
- .Xasldiv:
- movem.l 4(sp),d0/a1
- exg d0,a1
- move.l d0, -(sp) ; store copy of second operand
- move.l (a1),-(sp) ; store value for first operand
- bsr .Xldiv ; a1 not destroyed (but stack tidied)
- move.l d0,(a1) ; assign result
- bra fin
-
- .Xaslrem:
- movem.l 4(sp),d0/a1
- exg d0,a1
- move.l d0, -(sp) ; store copy of second operand
- move.l (a1),-(sp) ; store value for first operand
- bsr .Xlrem ; a1 not destroyed (but stack tidied)
- move.l d0,(a1) ; assign result
- bra fin
-
- .Xldiv: ; quotient of signed long quantities
- movem.l 4(sp),d0/d1
- tst.l d0
- bmi L1
- tst.l d1
- bpl Ruldiv
- neg.l d1
- L0:
- bsr Rdivu
- neg.l d0
- bra fin
- L1: neg.l d0
- tst.l d1
- bpl L0
- neg.l d1
- bra Ruldiv
-
- .Xlrem: ; remainder of signed long quantities
- movem.l 4(sp),d0/d1
- tst.l d1
- bpl L2
- neg.l d1
- L2: tst.l d0
- bpl Rulrem
- neg.l d0
- bsr Rdivu
- exg d1,d0
- neg.l d0
- bra fin
-
- .Xulrem: ; remainder of unsigned long quantities
- movem.l 4(sp),d0/d1
- Rulrem: bsr Rdivu
- exg d1,d0
- bra fin
-
- .Xuldiv: ; quotient of unsigned long quantities
- movem.l 4(sp),d0/d1
- Ruldiv: bsr Rdivu
- fin: move.l (sp)+,a0 ; get return address
- addq.l #8,sp ; remove two long parameters
- jmp (a0) ; return to calling code
-
- Rdivu: cmp.l d1,d0 ; the real work is done here
- bls L4
- move.l d1,d2
- swap d2
- tst.w d2
- bne L6
- move.l d0,d2
- divu d1,d2
- bvs L6
- moveq #$00,d0
- moveq #$00,d1
- move.w d2,d0
- swap d2
- move.w d2,d1
- rts
- L4: beq L5
- move.l d0,d1
- moveq #0,d0
- rts
- L5: moveq #1,d0
- moveq #0,d1
- rts
- L6: movea.l d1,a0
- moveq #31,d2
- moveq #0,d1
- L7:
- add.l d0,d0
- addx.l d1,d1
- cmpa.l d1,a0
- bhi L8
- sub.l a0,d1
- addq.l #1,d0
- L8: dbra d2,L7
- rts
-
- .Xasuldiv:
- movem.l 4(sp),d1/a1
- exg d1,a1
- move.l (a1),d0
- bsr Rdivu
- move.l d0,(a1) ; assign result
- bra fin
-
- .Xasulrem:
- movem.l 4(sp),d1/a1
- exg d1,a1
- move.l (a1),d0
- bsr Rdivu
- move.l d1,(a1) ; assign result
- bra fin
-